from TF.tfextrator.extrator.sintatico import Lexico
#Fazer os imports para acessar a API do DB. Ver listloader.
from django.core.management import setup_environ
import settings
setup_environ(settings)
from extrator.models import *

class agente:
    entrada = ''
    listaEquipe = []
    listaEstadio = []
    listaCidade = []
    
    def __init__(self, entrada):
        self.entrada = entrada
    
    #Objetivo: mudar o tipo ambíguo "EQUIPE-CIDADE" do analisador léxico
    #para apenas EQUIPE, em virtude da pesquisa ter como ênfase os times
    #que jogaram, além do usuário tipicamente referir-se às equipes, não
    #às cidades
    def simplificar(self, lista):
        for i in range(len(lista)):
                       if lista[i][1] == "EQUIPE-CIDADE":
                           lista[i] = (lista[i][0], "EQUIPE")
        return lista
    
    #Obejtivo: separar os tokens de um dado tipo
    def separar(self, lista, tipo):
        resultado = []
        for i in lista:
            if i[1] == tipo:
                resultado.append(i[0])
        return resultado
    
    #Objetivo: fazer as listas de cada tipo de token    
    def separaListas(self):
        analisador = Lexico(self.entrada)
        lista = analisador.Processar()
        lista = simplificar(lista)
        self.listaEquipe = separar(lista, "EQUPE")
        self.listaEstadio = separar(lista, "ESTADIO")
        self.listaCidade = separar(lista, "CIDADE")
    
    #Objetivo: retornar lista de partidas em função da entrada do usuário
    def buscar(self):
        
        #Antes de tudo, fazer a separação de listas
        separaListas()
        
        #Montando os pareamentos de times para quando necessário
        confrontos = []
        for equipe1 in listaEquipe:
            for equipe2 in listaEquipe:
                confrontos.append(equipe1, equipe2)
        
        partidas= []
        #Primeiro caso: apenas equipes na entrada
        if (len(self.listaEquipe)!=0 and len(self.listaCidade)==0 and len(self.listaEstadio)==0):
            confrontos = []
            for equipe1 in listaEquipe:
                for equipe2 in listaEquipe:
                    confrontos.append(equipe1, equipe2)
            
            for confronto in confrontos:
                busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1])
                if '__iter__' in dir(busca):
                    for i in busca:
                        partidas.append(i)
                else:
                    partidas.append(busca)
            return partidas
            
        #Segundo caso: apenas estádios
        elif (len(self.listaEquipe)==0 and len(self.listaCidade)==0 and len(self.listaEstadio)!=0):
            for campo in listaEstadio:
                busca = Partida.objects.filter(estadio__estadio__iexact=campo)
                if '__iter__' in dir(busca):
                    for i in busca:
                        partidas.append(i)
                else:
                    partidas.append(busca)
            return partidas
        
        #Terceiro caso: apenas cidade
        elif (len(self.listaEquipe)==0 and len(self.listaCidade)!=0 and len(self.listaEstadio)==0):
            
            for cid in listaCidade:
                busca = Partida.objects.filter(estadio__cidade__iexact=cid)
                if '__iter__' in dir(busca):
                    for i in busca:
                        partidas.append(i)
                else:
                    partidas.append(busca)
            return partidas
        
        #Quarto caso: equipes e estádios
        elif (len(self.listaEquipe)!=0 and len(self.listaCidade)==0 and len(self.listaEstadio)!=0):
            
            
            #As três coisas (time 1, time 2 e estadio) combinam
            for campo in listaEstadio:
                for confronto in confrontos:
                    busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1], estadio__estadio__iexact=campo)
                    if '__iter__' in dir(busca):
                        for i in busca:
                            partidas.append(i)
                    else:
                        partidas.append(busca)
            
            #Elas não combinam. Pegar partidas entre os times.
            for confronto in confrontos:
                busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1])
                if '__iter__' in dir(busca):
                    for i in busca:
                        if i not in partidas:
                            partidas.append(i)
                else:
                    if i not in partidas:
                        partidas.append(busca)
            
            #Agora, adicionar os jogos em estádios colocados...
            for campo in listaEstadio:
                busca = Partida.objects.filter(estadio__estadio__iexact=campo)
                if '__iter__' in dir(busca):
                    for i in busca:
                        if i not in partidas:
                            partidas.append(i)
                elif i not in partidas:
                    partidas.append(busca)
                        
            return partidas
        
        
        #Quinto caso: equipes e cidades
        elif (len(self.listaEquipe)!=0 and len(self.listaCidade)!=0 and len(self.listaEstadio)==0):
            
            
            #As três coisas (time 1, time 2 e cidade) combinam
            for cid in listaCidade:
                for confronto in confrontos:
                    busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1], estadio__cidade__iexact=cid)
                    if '__iter__' in dir(busca):
                        for i in busca:
                            partidas.append(i)
                    else:
                        partidas.append(busca)
            
            #Elas não combinam. Pegar partidas entre os times.
            for confronto in confrontos:
                busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1])
                if '__iter__' in dir(busca):
                    for i in busca:
                        if i not in partidas:
                            partidas.append(i)
                elif i not in partidas:
                    partidas.append(busca)
            
            #Agora, adicionar os jogos em cidades colocadas...
            for cid in listaCidade:
                busca = Partida.objects.filter(estadio__cidade__iexact=cid)
                if '__iter__' in dir(busca):
                    for i in busca:
                        if i not in partidas:
                            partidas.append(i)
                elif i not in partidas:
                    partidas.append(busca)
                        
            return partidas
        
        #Sexto caso: estádios e cidades
        elif (len(self.listaEquipe)==0 and len(self.listaCidade)!=0 and len(self.listaEstadio)!=0):
            
            #Primeiro, buscar os casos em que batem.
            for campo in listaEstadio:
                for cid in listaCidade:
                    busca = Partida.objects.filter(estadio__estadio__iexact=campo, estadio__cidade__iexact=cid)
                    if '__iter__' in dir(busca):
                        for i in busca:
                            partidas.append(i)
                    else:
                        partidas.append(busca)
            
            #Segundo, buscar os jogos por estádio.
            for campo in listaEstadio:
                busca = Partida.objects.filter(estadio__estadio__iexact=campo)
                if '__iter__' in dir(busca):
                    for i in busca:
                        if i not in partidas:
                            partidas.append(i)
                else:
                    if i not in partidas:
                        partidas.append(busca)
            
            #Terceiro, buscar os jogos por cidade
            for cid in listaCidade:
                busca = Partida.objects.filter(estadio__cidade__iexact=cid)
                if '__iter__' in dir(busca):
                    for i in busca:
                        if i not in partidas:
                            partidas.append(i)
                else:
                    if i not in partidas:
                        partidas.append(busca)
            
            return partidas
        
        #Sétimo caso: equipes, estádios, cidades
        elif (len(self.listaEquipe)!=0 and len(self.listaCidade)!=0 and len(self.listaEstadio)!=0):
            #As quatro coisas (time 1, time 2 , estádio e cidade) combinam
            for campo in listaEstadio:
                for cid in listaCidade:
                    for confronto in confrontos:
                        busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1], estadio__cidade__iexact=cid, estadio__estadio__iexact=campo)
                        if '__iter__' in dir(busca):
                            for i in busca:
                                partidas.append(i)
                        else:
                            partidas.append(busca)
            
            #Elas não combinam. Pegar partidas entre os times, pelo menos nos estádios...
            for campo in listaEstadio:
                for confronto in confrontos:
                    busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1], estadio__estadio__iexact=campo)
                    if '__iter__' in dir(busca):
                        for i in busca:
                            if i not in partidas:
                                partidas.append(i)
                    elif i not in partidas:
                        partidas.append(busca)
            
            #Agora, jogos independente de cidades e estádios...
            for confronto in confrontos:
                busca = Partida.objects.filter(equipe1__equipe__iexact=confronto[0], equipe2__iexact=confronto[1], estadio__cidade__iexact=cid, estadio__estadio__iexact=campo)
                if '__iter__' in dir(busca):
                    for i in busca:
                        if i not in partidas:
                            partidas.append(i)
                else:
                    if i not in partidas:
                        partidas.append(busca)
            
                        
            return partidas
        
        #Caso contrário... Não houve uma entrada válida
        else:
            #Partidas e enviada vazia. O módulo de processamento vai entender que a busca 
            #não teve resultado válido. 
            partidas = []
            return partidas